import { request } from '@/utils/request'
import type { RequestOptions } from '@/utils/request'

type ApiRequestConfig = Omit<RequestOptions, 'url' | 'method' | 'data'>

/**
 * 通用请求方法
 */
export const httpRequest = {
  /**
   * GET 请求
   * @param url 请求地址
   * @param params 请求参数
   * @param config 额外配置
   */
  get: <T = any>(url: string, params?: Record<string, any>, config: ApiRequestConfig = {}) => {
    return request.get<T>(url, params, config)
  },

  /**
   * POST 请求
   * @param url 请求地址
   * @param data 请求数据
   * @param config 额外配置
   */
  post: <T = any>(url: string, data?: any, config: ApiRequestConfig = {}) => {
    return request.post<T>(url, data, config)
  },

  /**
   * PUT 请求
   * @param url 请求地址
   * @param data 请求数据
   * @param config 额外配置
   */
  put: <T = any>(url: string, data?: any, config: ApiRequestConfig = {}) => {
    return request.put<T>(url, data, config)
  },

  /**
   * DELETE 请求
   * @param url 请求地址
   * @param data 请求数据
   * @param config 额外配置
   */
  delete: <T = any>(url: string, data?: any, config: ApiRequestConfig = {}) => {
    return request.delete<T>(url, data, config)
  },
}

/**
 * 常用业务请求方法
 */
export const apiRequest = {
  /**
   * 获取列表数据（分页）
   * @param url 请求地址
   * @param params 分页参数
   * @param params.pageNo 页码
   * @param params.pageSize 每页数量
   */
  getPageList: <T = any>(url: string, params: {
    pageNo: number
    pageSize: number
    [key: string]: any
  }) => {
    return httpRequest.get<{
      records: T[]
      total: number
      size: number
      current: number
      pages: number
    }>(url, params)
  },

  /**
   * 获取所有数据（不分页）
   * @param url 请求地址
   * @param params 查询参数
   */
  getAll: <T = any>(url: string, params?: Record<string, any>) => {
    return httpRequest.get<T[]>(url, params)
  },

  /**
   * 获取详情
   * @param url 请求地址
   * @param id ID
   */
  getById: <T = any>(url: string, id: string) => {
    return httpRequest.get<T>(`${url}/queryById`, { id })
  },

  /**
   * 添加数据
   * @param url 请求地址
   * @param data 数据
   */
  add: <T = any>(url: string, data: any) => {
    return httpRequest.post<T>(`${url}/add`, data)
  },

  /**
   * 更新数据
   * @param url 请求地址
   * @param data 数据
   */
  update: <T = any>(url: string, data: any) => {
    return httpRequest.put<T>(`${url}/edit`, data)
  },

  /**
   * 删除数据
   * @param url 请求地址
   * @param id ID
   */
  delete: (url: string, id: string) => {
    return httpRequest.delete(`${url}/delete`, { id })
  },

  /**
   * 批量删除
   * @param url 请求地址
   * @param ids ID数组
   */
  deleteBatch: (url: string, ids: string[]) => {
    return httpRequest.delete(`${url}/deleteBatch`, { ids })
  },

  /**
   * 导出Excel
   * @param url 请求地址
   * @param params 查询参数
   */
  exportExcel: (url: string, params?: Record<string, any>) => {
    return request.download(`${url}/exportXls`, params)
  },

  /**
   * 导入Excel
   * @param url 请求地址
   * @param file 文件
   */
  importExcel: (url: string, file: string) => {
    return request.upload(`${url}/importExcel`, file)
  },

  /**
   * 上传文件
   * @param url 请求地址
   * @param file 文件
   * @param data 额外数据
   */
  uploadFile: (url: string, file: string, data?: Record<string, any>) => {
    return request.upload(url, file, data)
  },

  /**
   * 下载文件
   * @param url 请求地址
   * @param params 查询参数
   */
  downloadFile: (url: string, params?: Record<string, any>) => {
    return request.download(url, params)
  },
}
